﻿#include <windows.h>
#include <tchar.h>
#include <stdio.h>

// 目标窗口标题关键字
const TCHAR* TARGET_KEYWORDS[] = {
    _T("Visual Studio"),    // VS2022
    _T("IntelliJ IDEA"),    // IDEA
    _T("Trae"),            // Trae
    _T("Keil")              // Keil
};
const int TARGET_COUNT = 4;  // 目标数量从2改为4（新增2个）

// 你的中文输入法KLID（替换为实际值）
const TCHAR* CHINESE_KLID = _T("00000804");

// 全局状态：标记是否已切换到目标状态
BOOL g_isTargetStateSet = FALSE;

// 切换到中文输入法+英文标点
void switchToChineseWithEnPunct() {
  HKL chineseLayout = LoadKeyboardLayout(CHINESE_KLID, KLF_ACTIVATE);
  if (chineseLayout == NULL) {
    printf("输入法加载失败，检查KLID\n");
    return;
  }
  ActivateKeyboardLayout(chineseLayout, KLF_SETFORPROCESS);

  // 模拟Ctrl+.切换英文标点（根据输入法快捷键调整）
  keybd_event(VK_CONTROL, 0, 0, 0);
  keybd_event(VK_OEM_PERIOD, 0, 0, 0);
  Sleep(50);
  keybd_event(VK_OEM_PERIOD, 0, KEYEVENTF_KEYUP, 0);
  keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);

  printf("已切换：中文输入法（英文标点）\n");
}

// 检查当前窗口是否为目标窗口
BOOL isTargetWindow(HWND hwnd) {
  TCHAR windowTitle[512] = { 0 };
  GetWindowText(hwnd, windowTitle, sizeof(windowTitle) / sizeof(TCHAR) - 1);

  // 遍历所有目标关键字，只要标题包含其中一个就判定为目标窗口
  for (int i = 0; i < TARGET_COUNT; i++) {
    if (_tcsstr(windowTitle, TARGET_KEYWORDS[i]) != NULL) {
      _tprintf(_T("识别到目标窗口：%s\n"), windowTitle); // 调试用
      return TRUE;
    }
  }
  return FALSE;
}

int main() {
  // 启动时立即切换一次输入法
  printf("程序启动，初始化输入法\n");
  switchToChineseWithEnPunct();

  printf("开始监控：VS2022、IDEA、Trados、Keil\n");
  printf("按Ctrl+C退出\n");

  while (1) {
    HWND foregroundWnd = GetForegroundWindow();
    BOOL isCurrentTarget = (foregroundWnd != NULL) && isTargetWindow(foregroundWnd);

    // 状态记忆逻辑：只在必要时切换
    if (isCurrentTarget && !g_isTargetStateSet) {
      switchToChineseWithEnPunct();
      g_isTargetStateSet = TRUE;
    }
    else if (!isCurrentTarget && g_isTargetStateSet) {
      printf("离开目标窗口，重置状态\n");
      g_isTargetStateSet = FALSE;
    }

    Sleep(500);
  }

  return 0;
}